gtk: Add convenience function for creating render nodes
authorEmmanuele Bassi <ebassi@gnome.org>
Thu, 4 Aug 2016 14:22:00 +0000 (15:22 +0100)
committerEmmanuele Bassi <ebassi@gnome.org>
Tue, 18 Oct 2016 10:49:11 +0000 (11:49 +0100)
GtkWidget.create_render_node() sets up a GskRenderNode appropriate for
rendering the contents of a widget, including its bounds,
transformation, and anchor point.

gtk/gtkwidget.c
gtk/gtkwidgetprivate.h

index f2f4d5a6d9e1724e238f9504b16b16455d5cef29..cd3d4bc2ee9c7c70233e14052c1242168a8afd85 100644 (file)
@@ -15839,6 +15839,32 @@ gtk_widget_get_renderer (GtkWidget *widget)
   return NULL;
 }
 
+GskRenderNode *
+gtk_widget_create_render_node (GtkWidget   *widget,
+                               GskRenderer *renderer,
+                               const char  *name)
+{
+  GskRenderNode *res = gsk_renderer_create_render_node (renderer);
+  GtkAllocation allocation, clip;
+  graphene_point3d_t p;
+  graphene_rect_t bounds;
+  graphene_matrix_t m;
+
+  gtk_widget_get_allocation (widget, &allocation);
+  gtk_widget_get_clip (widget, &clip);
+
+  graphene_rect_init (&bounds, 0, 0, clip.width, clip.height);
+  graphene_matrix_init_translate (&m, graphene_point3d_init (&p, allocation.x, allocation.y, 0));
+  graphene_point3d_init (&p, clip.x - allocation.x, clip.y - allocation.y, 0);
+
+  gsk_render_node_set_name (res, name);
+  gsk_render_node_set_bounds (res, &bounds);
+  gsk_render_node_set_transform (res, &m);
+  gsk_render_node_set_anchor_point (res, &p);
+
+  return res;
+}
+
 GskRenderNode *
 gtk_widget_get_render_node (GtkWidget   *widget,
                             GskRenderer *renderer)
index 4903d06d23fef9c186042ed3d9bfc23719d24abf..2efd92211160cddd42b1954f1da4b0c0f328f610 100644 (file)
@@ -299,6 +299,10 @@ void              gtk_widget_render                        (GtkWidget
 GskRenderNode *   gtk_widget_get_render_node               (GtkWidget   *widget,
                                                             GskRenderer *renderer);
 
+GskRenderNode *   gtk_widget_create_render_node            (GtkWidget   *widget,
+                                                            GskRenderer *renderer,
+                                                            const char  *name);
+
 /* inline getters */
 
 static inline gboolean